package com.eianiao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.eianiao.bean.Category;
import com.eianiao.bean.Dish;
import com.eianiao.bean.Setmeal;
import com.eianiao.common.PageParam;
import com.eianiao.dao.CategoryDao;
import com.eianiao.dto.DishDto;
import com.eianiao.exception.CustomException;
import com.eianiao.service.CategoryService;
import com.eianiao.service.DishService;
import com.eianiao.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author eianiao
 * @Date 2022 06
 * @Version 1.0
 **/
@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {

   @Autowired
   private CategoryDao dao;

   @Autowired
   private DishService dishService;

   @Autowired
   private SetmealService setmealService;


    /**
     * 添加菜品
     *
     * @param category
     * @return
     */
    @Override
    public int add(Category category) {
        return dao.insert(category);
    }

    /**
     * 查询菜品
     *
     * @param pageParam
     * @return
     */
    @Override
    public IPage<Category> findPage(PageParam pageParam) {
        IPage<Category> CategoryIPage = new Page<>(pageParam.getPage(), pageParam.getPageSize());
//        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
//        qw.like(pageParam.getName() != null,Category::getName,pageParam.getName());

        return dao.selectPage(CategoryIPage,null);
    }


    /**
     * 删除菜品
     *
     * @param id
     * @return
     */
    @Override
    public int delete(long id) {
//1. 拿着这个id去查询菜品表，看看有没有菜品是这种分类的
        List<DishDto> dishList = dishService.findByCategoryId(id,null,null);

        //1.1 如果满足这个条件，即表示该分类是有菜品数据的， 那么禁止删除！
        if(dishList != null && dishList.size() > 0){
            //这里可以直接返回-1，然后在controller 里面判断结果是不是-1， 如果是
            //就告诉前端，有关联的菜品数据，禁止删除！
            //return -1 ;
            throw new CustomException("该分类下有关联菜品数据，禁止删除！");
        }


        //2. 拿着这个id去查询套餐表，看看有没有套餐是这种分类的。
        List<Setmeal> setmealList = setmealService.findByCategoryId(id);

        //2.1 如果满足这个条件，即表示该分类是有套餐数据的， 那么禁止删除！
        if(setmealList != null && setmealList.size() > 0){
            //这里可以直接返回-2，然后在controller 里面判断结果是不是-2， 如果是
            //就告诉前端，有关联的套餐数据，禁止删除！
            //return -2;
            throw new CustomException("该分类下有关联套餐数据，禁止删除！");
        }

        //3. 如果代码来到了这里，即表示上面的两个if判断都不匹配，也就是
        //    这个分类没有任何的菜品数据和套餐数据，可以删除！
        return dao.deleteById(id);
    }


    /**
     * 添加菜品
     *
     * @param category
     * @return
     */
    @Override
    public int update(Category category) {
        return dao.updateById(category);
    }


    /**
     * 查询类型为1的菜品
     *
     * @param type
     * @return
     */
    @Override
    public List<Category> findByType(Integer type) {
        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
        qw.eq(type != null,Category::getType,type);

        return dao.selectList(qw);
    }

    /**
     * 根据id查询菜品
     *
     * @param categoryId
     * @return
     */
    @Override
    public Category findById(Long categoryId) {
      /*  LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
        qw.eq(Category::getId,categoryId);*/

//        return dao.selectById(qw);
        return dao.selectById(categoryId);
    }


}
